package com.wunong.smart.invoker.core.support;

import com.alibaba.fastjson.JSONObject;
import com.wunong.smart.invoker.core.api.ValueConverter;
import org.apache.commons.beanutils.ConvertUtils;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

/**
 * @author created by zealot.zt
 */
public class DefaultValueConverter implements ValueConverter {

    /**
     * 包装类
     */
    protected static final List<Class<?>> WRAP_CLASS = Arrays.asList(Boolean.class, Character.class, Byte.class,
            Short.class, Integer.class, Long.class, Float.class, Double.class, String.class, Object.class);

    @Override
    public Object convert(Class<?> parameterType, Object paramValue) {
        // 若没有传值，直接返回
        if (paramValue == null || "null".equals(paramValue)) {
            return null;
        }

        // 为原始数据类型或包装了下，直接转换
        if (parameterType.isPrimitive() || WRAP_CLASS.contains(parameterType)) {
            String value = paramValue.toString();
            // 转换当前值
            return ConvertUtils.convert(value, parameterType);
        } else if (parameterType == List.class) {
            // List对象
            if (paramValue instanceof String) {
                return JSONObject.parseArray((String) paramValue);
            }

            String json = JSONObject.toJSONString(paramValue);
            return JSONObject.parseArray(json);
        } else if (parameterType == Map.class) {
            // map对象
            if (paramValue instanceof String) {
                return JSONObject.parse((String) paramValue);
            }

            String json = JSONObject.toJSONString(paramValue);
            return JSONObject.parseObject(json);
        } else {
            // json序列化与反序列化
            String json = JSONObject.toJSONString(paramValue);
            return JSONObject.parseObject(json, parameterType);
        }
    }

}
